/**
 * @PROJECT_NAME: design_patterns
 * @DESCRIPTION: 策略模式 Strategy Pattern
 * 该模式定义了一系列算法，并将每个算法封装起来，使他们可以相互替换，且算法的变化不会影响使用算法的客户，策略模式属于对象行为模式，
 * 它通过对算法的封装，把使用算法的责任和算法的实现分割开来，并委派给不同的对象对这些算法进行管理。
 * 例如我们出行可以选择的出行方式有很多种如可以骑自行车，可以坐汽车，可以坐火车，可以坐飞机。
 * <p>
 * 结构：
 * <p>
 * 抽象策略类（Abstract Strategy）：这是一个抽象角色，通常由一个接口或抽象类实现，此角色给出所有的具体策略类所需的接口。
 * <p>
 * 具体策略类（Concrete Strategy）：实现了抽象策略定义的接口，提供具体的算法实现或行为。
 * <p>
 * 环境（Context）：持有一个策略类的引用，最终给客户端调用。
 * <p>
 * 案例：促销活动
 * <p>
 * 百货公司在定年度促销活动，针对不同的节日提出不同的促销活动，由促销员将促销活动展示给客户：
 * <p>
 * 春节：买一东一
 * <p>
 * 中秋节：满200减50
 * <p>
 * 圣诞节：满1000加1元换购任意200元以下商品。
 * <p>
 * 优缺点：
 * <p>
 * 优点:
 * <p>
 * 策略类之间可以自由切换：由于粗略类都实现同一个接口，所以使他们直接可以自由切换。
 * 易于扩展：
 * <p>
 * 增加一个新成员只需要添加一个具体的策略类即可，基本不需要改变原有的代码，符合“开闭原则”
 * <p>
 * 避免使用多重条件选择语句，充分体现面向对象设计思想。
 * <p>
 * 缺点：
 * <p>
 * 客户端必须知道所有的策略类，并自行决定使用哪一个策略类。
 * <p>
 * 策略模式将造成产生很多策略类，可以通过使用享元模式在一定程度上减少对象的数量。
 * <p>
 * 使用场景：
 * <p>
 * 一个系统需要动态的在几种算法中选择一种时，可将每个算法封装到策略类中。
 * <p>
 * 一个类定义了多种行为，并且这些行为在这个类的操作中可以多个条件语句的形式出现，可将每个条件分支植入到他们各个策略类中以代替这些条件语句。
 * <p>
 * 系统中各算法批次完全独立，且要求对客户隐藏具体算法的实现细节时。
 * <p>
 * 系统要求使用算法的客户不应该知道其操作的数据时，可使用策略模式隐藏与算法相关的数据结构
 * <p>
 * 多个类只区别在表现行为不同，可以使用策略模式，在运行时动态选择具体要执行的行为。
 * @AUTHOR: CNBruceLee
 * @DATE: 2021/8/26 7:12
 */
package com.bruce.demo2.patterns.demo3.behavioral.demo14.strategy;
